home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / lib / rcscripts / net.modules.d / dhclient < prev    next >
Text File  |  2006-04-25  |  4KB  |  165 lines

  1. # Copyright (c) 2004-2005 Gentoo Foundation
  2. # Distributed under the terms of the GNU General Public License v2
  3. # $Header: /var/cvsroot/gentoo-src/rc-scripts/net-scripts/net.modules.d/dhclient,v 1.18.2.3 2005/01/25 10:42:54 uberlord Exp $
  4.  
  5. # Contributed by Roy Marples (uberlord@gentoo.org)
  6.  
  7. # Fix any potential localisation problems
  8. # Note that LC_ALL trumps LC_anything_else according to locale(7)
  9. dhclient() {
  10.     LC_ALL=C /sbin/dhclient "$@"
  11. }
  12.  
  13. # char* dhclient_provides(void)
  14. #
  15. # Returns a string to change module definition for starting up
  16. dhclient_provides() {
  17.     echo "dhcp"
  18. }
  19.  
  20. # void dhclient_depend(void)
  21. #
  22. # Sets up the dependancies for the module
  23. dhclient_depend() {
  24.     after interface
  25. }
  26.  
  27. # bool dhclient_check_installed(void)
  28. #
  29. # Returns 1 if dhclient is installed, otherwise 0
  30. dhclient_check_installed() {
  31.     [[ -x /sbin/dhclient ]] && return 0
  32.     ${1:-false} && eerror "For DHCP (dhclient) support, emerge net-misc/dhcp"
  33.     return 1
  34. }
  35.  
  36. # char* dhclient_get_script(void)
  37. #
  38. # Returns the filename of the script to run
  39. dhclient_get_script() {
  40.     local module=$( interface_module )
  41.     echo "${MODULES_DIR}/helpers.d/dhclient-${module}"
  42. }
  43.  
  44. # bool dhclient_check_depends(void)
  45. #
  46. # Checks to see if we have the needed functions
  47. dhclient_check_depends() {
  48.     local f
  49.  
  50.     for f in interface_variable interface_device interface_is_up interface_get_address interface_module; do
  51.         [[ $( type -t ${f} ) == function ]] && continue
  52.         eerror "dhclient: missing required function ${f}\n"
  53.         return 1
  54.     done
  55.  
  56.     return 0
  57. }
  58.  
  59. # char* dhclient_get_vars(char *interface)
  60. #
  61. # Returns a string spaced with possible user set
  62. # configuration variables
  63. dhclient_get_vars() {
  64.     echo "dhclient_${1} dhcp_${1}"
  65. }
  66.  
  67. # bool dhclient_stop(char *iface)
  68. #
  69. # Stop dhclient on an interface
  70. # Always returns 0
  71. dhclient_stop() {
  72.     local iface=${1} dhcp release pidfile="/var/run/dhclient-${1}.pid"
  73.     
  74.     dhclient_check_installed || return 0
  75.     [[ ! -f ${pidfile} ]] && return 0
  76.  
  77.     # We check for a dhclient process first as if we attempt to release
  78.     # an interface for which dhclient has obtained an IP in the past
  79.     # it causes a "RELEASE" event anyway.
  80.     local pid=$( cat ${pidfile} )
  81.     local script=$( dhclient_get_script )
  82.  
  83.     eval dhcp=\" \$\{dhcp_${ifvar}\} \"
  84.  
  85.     ebegin "Stopping dhclient on ${iface}"
  86.     if [[ ${dhcp} == *' release '* ]]; then
  87.         local r=$( dhclient -q -r -sf ${script} -pf ${pidfile} ${iface} )
  88.         [[ ${r} == deconfig ]]
  89.         eend $? "dhclient returned a ${r}"
  90.     else
  91.         kill -s TERM ${pid} 2>/dev/null
  92.         clean_pidfile ${pidfile}
  93.         eend 0
  94.     fi
  95.  
  96.     return 0
  97. }
  98.  
  99. # bool dhclient_start(char *iface)
  100. #
  101. # Start DHCP on an interface by calling dhclient $iface $options
  102. #
  103. # Returns 0 (true) when a DHCP address is obtained, otherwise 1
  104. dhclient_start() {
  105.     local iface=${1} opts pidfile="/var/run/dhclient-${1}.pid"
  106.     local ifvar=$( interface_variable ${iface} ) x
  107.     local cffile="/etc/dhclient.conf"
  108.  
  109.     interface_exists ${iface} true || return 1
  110.  
  111.     local script=$( dhclient_get_script )
  112.  
  113.         # Load our options
  114.     eval opts=\" \$\{dhclient_${ifvar}\} \"
  115.  
  116.     # Work out our cffile
  117.     x="${opts##* -cf }"
  118.     if [[ ${x} != ${opts} ]]; then
  119.         x="${x%% *}"
  120.         if [[ -n ${x} ]]; then
  121.         cffile="${x}"
  122.         opts="${opts//-cf ${cffile}/}"
  123.         fi
  124.     fi
  125.     opts="${opts} -cf ${cffile}"
  126.  
  127.     # Ensure that the cffile does not contain any script lines
  128.     # as that will stop our helpers from running
  129.     if [[ -e ${cffile} ]] ; then
  130.         if grep -q "^[ \t]*script " "${cffile}" ; then
  131.                 eerror "You have to remove the script parameter from ${cffile}"
  132.                 return 1
  133.             fi
  134.         fi
  135.  
  136.     # Bring up DHCP for this interface (or alias)
  137.     ebegin "Running dhclient"
  138.  
  139.     if ! clean_pidfile ${pidfile} ; then
  140.         ewarn "dhclient is already running on ${iface}"
  141.         eend 0
  142.         return 0
  143.     fi
  144.  
  145.     eval opts=\"\$\{dhclient_${ifvar}\}\"
  146.     local x=$( dhclient ${opts} -1 -sf ${script} -pf ${pidfile} -q ${iface} 2>&1 )
  147.  
  148.     # We just check the last 5 letters
  149.     [[ ${x:${#x} - 5:5} == bound ]]
  150.     if [[ $? != 0 ]]; then
  151.         echo "${x}" >&2
  152.         # We need to kill the process if we fail
  153.         kill -s TERM $( < ${pidfile} ) 2>/dev/null
  154.         eend 1
  155.         return 1
  156.     fi
  157.     eend 0
  158.  
  159.     # DHCP succeeded, show address retrieved
  160.     local addr=$( interface_get_address ${iface} )
  161.     einfo "${iface} received address ${addr}"
  162.  
  163.     return 0
  164. }
  165.